package cl.gob.minvu.catastromobile;

import org.json.JSONObject;

import com.google.gson.Gson;

import cl.gob.minvu.catastromobile.dao.ComunaDAO;
import cl.gob.minvu.catastromobile.dao.DatabaseHelper;
import cl.gob.minvu.catastromobile.dao.UsuarioDAO;
import cl.gob.minvu.catastromobile.entities.Comuna;
import cl.gob.minvu.catastromobile.entities.Usuario;
import cl.gob.minvu.catastromobile.util.GenericUtil;
import cl.gob.minvu.catastromobile.util.MyComunaAdapter;
import cl.gob.minvu.catastromobile.util.RestService;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.EditText;
import android.widget.Spinner;

/**
 * @author psep
 * 
 */
public class MainActivity extends AbstractActivity {

	private EditText runField;
	private EditText dvField;
	private EditText emailField;
	private EditText profesionField;
	private EditText passwdField;
	private Spinner regionSpinner;
	private Spinner comunaSpinner;
	private Usuario usuario;
	private UsuarioDAO userDAO;
	private ComunaDAO comunaDAO;
	public ProgressDialog progress;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		new DatabaseHelper(this).getWritableDatabase();
		this.userDAO = new UsuarioDAO(this);
		this.comunaDAO = new ComunaDAO(this);
		this.valida();
		this.usuario = new Usuario();
		this.runField = (EditText) super.findViewById(R.id.editTextRut);
		this.dvField = (EditText) super.findViewById(R.id.editTextDv);
		this.emailField = (EditText) super.findViewById(R.id.editTextEmail);
		this.profesionField = (EditText) super
				.findViewById(R.id.editTextProfesion);
		this.passwdField = (EditText) super.findViewById(R.id.editTextPasswd);
		this.regionSpinner = (Spinner) super
				.findViewById(R.id.spinnerRegionUser);
		this.comunaSpinner = (Spinner) super
				.findViewById(R.id.spinnerComunaUser);

		this.regionSpinner
				.setOnItemSelectedListener(new OnItemSelectedListener() {
					public void onItemSelected(AdapterView<?> parent,
							View view, int position, long id) {
						comunaSpinner.setAdapter(new MyComunaAdapter(
								MainActivity.this, comunaDAO.retrieve(position)));
					}

					public void onNothingSelected(AdapterView<?> parent) {

					}
				});
	}

	/**
	 * Método que valida la existencia de un usuario
	 * en la base de datos. Si éste existe, redirige
	 * a la actividad de Menú Principal de la app.
	 */
	private void valida() {
		Usuario usuario = this.userDAO.retrieve();
		
		if (usuario != null) {
			super.startActivity(new Intent(this, OptionsActivity.class));
			finish();
		}
	}

	/**
	 * @param button
	 */
	public void onClickLogin(View button) {
		if (this.validateFrm()) {
			if (!GenericUtil.validateRun(this.usuario.run, this.usuario.dv)) {
				this.runField.setError("El RUN ingresado no es válido");
				this.dvField.setError("El RUN ingresado no es válido");
			} else if (!GenericUtil.isConnected(this)) {
				super.toastMsg("Usted no dispone de conexión a internet, intente más tarde");
			} else {
				//TODO cambiar en prod
				String url = "http://10.150.203.71:8080/Catastro/ConsultaToken?object=";
				String object = GenericUtil.encode(new Gson().toJson(this.usuario));
				new HttpAsyncTask().execute(url, object);
			}
		}
	}

	/**
	 * @author psep
	 * 
	 */
	private class HttpAsyncTask extends AsyncTask<String, Void, String> {

		@Override
		protected void onPreExecute() {
			progress = ProgressDialog.show(MainActivity.this,
					"Creando el usuario...",
					"Estamos comprobando sus datos, espere por favor.");
		}

		@Override
		protected String doInBackground(String... urls) {
			return RestService.GET(urls[0], urls[1]);
		}

		@Override
		protected void onPostExecute(String result) {
			String msg = createUser(result);
			progress.dismiss();

			if (msg == null) {
				startActivity(new Intent(MainActivity.this,
						OptionsActivity.class));
				finish();
			} else {
				toastMsg(msg);
			}
		}
	}
	
	/**
	 * @param jsonStr
	 * @return
	 */
	public String createUser(String jsonStr) {
		String result = null;

		try {
			JSONObject json = new JSONObject(jsonStr);
			String token = (String) GenericUtil.getFieldByJSON(json, "token");
			
			if (token == null) {
				return RestService.getErrorMessage(jsonStr);
			} else {
				this.usuario.token = token;
				this.usuario.nombres = (String) GenericUtil.getFieldByJSON(json, "nombres");
				this.usuario.apellidoPaterno = (String) GenericUtil.getFieldByJSON(json, "apellidoPaterno");
				this.usuario.apellidoMaterno = (String) GenericUtil.getFieldByJSON(json, "apellidoMaterno");

				this.userDAO.insert(this.usuario);
			}

		} catch (Exception e) {
			return RestService.getErrorMessage(jsonStr);
		}
		
		return result;
	}
	
	@Override
	protected void onPause() {
		this.userDAO.finalize();
		this.comunaDAO.finalize();
		super.onPause();
	}

	@Override
	public void reset() {
	}

	@Override
	public boolean validateFrm() {
		int validador = 0;

		String run = super.getStringEditText(this.runField);
		String dv = super.getStringEditText(this.dvField);
		String email = super.getStringEditText(this.emailField);
		String profesion = super.getStringEditText(this.profesionField);
		String passwd = super.getStringEditText(this.passwdField);
		int idRegion = super.getIdSpinner(this.regionSpinner);
		int idComuna = super.getIdSpinner(this.comunaSpinner);

		if (run.length() == 0) {
			this.runField.setError("Debe ingresar su RUN completo");
			validador = validador + 1;
		}

		if (dv.length() == 0) {
			this.dvField.setError("Debe ingresar su RUN completo");
			validador = validador + 1;
		}

		if (email.length() == 0) {
			this.emailField.setError("Debe ingresar su email");
			validador = validador + 1;
		}

		if (profesion.length() == 0) {
			this.profesionField.setError("Debe ingresar su profesión u oficio");
			validador = validador + 1;
		}

		if (passwd.length() < 5) {
			this.passwdField
					.setError("Debe ingresar una contraseña de más de cuatro caracteres");
			validador = validador + 1;
		}

		if (idRegion == 0) {
			super.toastMsg("Debe ingresar su región");
			validador = validador + 1;
		}

		if (idComuna == 0) {
			super.toastMsg("Debe ingresar su comuna");
			validador = validador + 1;
		}

		if (validador == 0) {
			this.usuario.loadRunCompleto(run, dv);
			this.usuario.email = email;
			this.usuario.profesion = profesion;
			this.usuario.passwd = passwd;
			this.usuario.comuna = ((Comuna) this.comunaSpinner
					.getSelectedItem()).id;
			this.usuario.region = this.regionSpinner.getSelectedItemPosition();

			return true;

		} else {
			return false;
		}
	}
}
